package db

import (
	"demo/infra/config"
	"fmt"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"log"
	"time"
)

var DB *gorm.DB

// DSN 定义数据库连接信息

const DSN = "host=%s user=%s password=%s dbname=short_url port=%d sslmode=disable TimeZone=Asia/Shanghai"

func Init(conf config.DbConf) {
	db, err := gorm.Open(postgres.Open(fmt.Sprintf(DSN, conf.Host, conf.Username, conf.Password, conf.Port)), &gorm.Config{})
	if err != nil {
		log.Fatalf("failed to connect database: %v", err)
	}
	DB = db
	// 注册全局 edit_time 回调
	registerEditTimeCallback(db)
}

func registerEditTimeCallback(db *gorm.DB) {
	// 在更新操作前执行（After 表示在 GORM 内置更新逻辑之后，但在生成 SQL 之前）
	db.Callback().Update().After("gorm:assign_updates").Register("global:update_edit_time", func(db *gorm.DB) {
		// 跳过没有 edit_time 字段的模型
		if _, ok := db.Statement.Schema.FieldsByName["edit_time"]; !ok {
			return
		}
		// 自动设置 edit_time 为当前时间
		db.Statement.SetColumn("edit_time", time.Now())
	})
}
